/**
 * Copyright (c) 2012-2013 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */

package com.nokia.example.amaze;

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
 * The splash screen. 
 */
public class SplashScreen extends Canvas {
    // Members
    private final Listener _listener;
    private Image _image;
    private final int _backgroundColor;
    private int _centerX;
    private int _centerY;
    
    /**
     * Creates a splash screen to display the specified image and fills the
     * background with the specified color.
     * 
     * @param backgroundColor The background color.
     */
    public SplashScreen(Listener listener, final int backgroundColor) {
        setFullScreenMode(true);
        _listener = listener;
        _backgroundColor = backgroundColor;
    }

    /**
     * From Canvas.
     */
    protected void paint(Graphics graphics) {
        graphics.setColor(_backgroundColor);
        graphics.fillRect(0x00, 0x00, getWidth(), getHeight());

        if (_image != null) {
            graphics.drawImage(_image, _centerX, _centerY, 0x00);
        }
    }

    /**
     * Loads the splash screen image.
     * @param image The path of the image to load.
     */
    public void loadImage(String image) {
        try {
            _image = Image.createImage(image);
            
            // Calculate the center position
            _centerX = (getWidth() - _image.getWidth()) / 2;
            _centerY = (getHeight() - _image.getHeight()) / 2;
        }
        catch (IOException e) {}
    }
    
    /**
     * Shows the splash and changes to the specified displayable after the
     * specified number of milliseconds.
     * 
     * @param display Current Display.
     * @param next new Displayable.
     * @param millis splash time in milliseconds.
     */
    public void show(final Display display,
                     final Displayable next,
                     final long millis)
    {
        display.setCurrent(this);

        // Schedule next Displayable
        Thread t = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(millis);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    display.setCurrent(next);
                    
                    if (_listener != null) {
                        _listener.onFinished();
                    }
                }
            }
        });
        t.start();
    }
    
    /**
     * Interface for MIDlet so that it can know when the splash screen can be
     * released for garbage collection.
     */
    public interface Listener {
        void onFinished();
    }
}
